﻿
namespace FastFood.Windows.Forms.Procesos
{
    using System;
    using System.Collections.Generic;
    using System.Data.Linq;
    using System.Drawing;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;
    using FastFood.Business.Entities.Tipos;

    public partial class CwfCompras : UserControl
    {
        CwfProveedorBusqueda cwfProveedorBusqueda;
        public decimal costo
        {
            set { this.precioTextBox.Text = value.ToString(); }
        }
        public EstadoActual estadoActual;
        private Font font;
        
        public CwfCompras()
        {
            InitializeComponent();
            SetFont();
        }

        private void CwfPlatos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                cwfDetallesCompras1.miCwfCompras = this;
                ClearControls();
                cmbComprasEstados.SelectedIndex = 0;
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                cwfProveedorBusqueda = new CwfProveedorBusqueda();
                cwfProveedorBusqueda.CwfProveedorBusqueda_SeleccionEntidad += new GetObjeto(proveedorBusqueda_SeleccionEntidad);
                cwfProveedorBusqueda.BorderStyle = BorderStyle.None;
                proveedorCmb.DropDownControl = cwfProveedorBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cwfDetallesCompras1.ListaDetalle = new List<DetallesCompras>();
            this.cwfDetallesCompras1.InitialLoad();
            splitContainer3.Focus();
            //this.nombreTextBox.Focus();
            this.compraBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.proveedorCmb.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.compraBindingSource.Current != null)
                {
                    LoadProducto(this.compraBindingSource.Current as Compras);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.compraBindingSource.Current != null)
                    {
                        LoadProducto(this.compraBindingSource.Current as Compras);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.compraDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
                this.cwfDetallesCompras1.ListaDetalle = new List<DetallesCompras>();
                this.cwfDetallesCompras1.InitialLoad();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.compraBindingSource.CancelEdit();
            this.compraDataGridView.Focus();
        }

        private void platoDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadProducto(this.compraBindingSource.Current as Compras);
            }
        }

        private void platoDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.compraDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.compraBindingSource.Current != null)
                        {
                            LoadProducto(this.compraBindingSource.Current as Compras);
                        }
                    }
                }
            }
        }

        private void InitialLoad()
        {
            if (cmbComprasEstados.SelectedIndex != -1)
            {
                try
                {
                    ComprasManager compraManager = new ComprasManager();
                    List<Compras> temp = new List<Compras>(compraManager.ListarByEstado(cmbComprasEstados.Text));
                    this.compraBindingSource.DataSource = temp;
                    this.compraBindingNavigator.BindingSource = this.compraBindingSource;
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
        }

        private void LoadProducto(Compras compra)
        {
            compra = new ComprasManager().Obtener(compra.compraID);
            lblCodigo.CargarCodigo(MotivoMovimiento.Compras, compra.compraID);
            this.compraIDLabel.Text = compra.compraID.ToString();
            this.proveedorIDLabel.Text = compra.proveedorID.ToString();
            this.proveedorCmb.Text = compra.nombreProveedor;
            this.cmbTipoDocumento.SelectedIndex = Convert.ToInt32(compra.tipoDocumento);
            this.serieTextBox.Text = compra.serieDocumento;
            this.numeroTextBox.Text = compra.numeroDocumento.ToString();
            this.precioTextBox.Text = compra.costoTotal.ToString();
            this.compraIDLabel.Text = compra.compraID.ToString();
            this.cwfDetallesCompras1.ListaDetalle = compra.DetallesCompras.ToList() ?? new List<DetallesCompras>();
            this.cwfDetallesCompras1.InitialLoad();            
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                ComprasManager compraManager = new ComprasManager();

                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        compraManager.Agregar(GetCompra());
                        break;
                    case EstadoActual.Editar:
                        compraManager.Modificar(GetCompra());
                        break;
                    case EstadoActual.Eliminar:
                        compraManager.Eliminar(GetCompra());
                        this.compraBindingSource.RemoveCurrent();
                        break;
                }

                this.compraBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Compras GetCompra()
        {
            Compras compra = new Compras()
            {
                compraID = Convert.ToInt16(compraIDLabel.Text),
                proveedorID = Convert.ToInt16(proveedorIDLabel.Text),
                tipoDocumento = Convert.ToBoolean(cmbTipoDocumento.SelectedIndex),
                serieDocumento = serieTextBox.Text,
                numeroDocumento = Convert.ToInt32(numeroTextBox.Text),
                personalID = DatosGenerales.PersonalActual.personalID,
                personalDevolucionID = DatosGenerales.PersonalActual.personalID
            };
            compra.DetallesCompras = new EntitySet<DetallesCompras>();
            compra.DetallesCompras.AddRange(cwfDetallesCompras1.ListaDetalle);
            return compra;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.proveedorIDLabel.Text == "-1")
            {
                this.errValidator.SetError(this.proveedorCmb, "Seleccionar Proveedor.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.proveedorCmb, string.Empty);
            }

            if (this.cmbTipoDocumento.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbTipoDocumento, "Seleccionar Tipo de Documento.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbTipoDocumento, string.Empty);
            }

            if (string.IsNullOrEmpty(serieTextBox.Text))
            {
                this.errValidator.SetError(this.serieTextBox, "Ingresar Serie.");
                result = false;
            }
            else if (serieTextBox.Text.Length != 4)
            {
                this.errValidator.SetError(this.serieTextBox, "La serie debe tener 4 caracteres exactamente.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.serieTextBox, string.Empty);
            }
            
            if (string.IsNullOrEmpty(numeroTextBox.Text))
            {
                this.errValidator.SetError(this.numeroTextBox, "Ingresar Numero.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.numeroTextBox, string.Empty);
            }

            if (cwfDetallesCompras1.ListaDetalle.Count == 0)
            {
                this.errValidator.SetError(this.DetalleLabel, "Ingresar el Detalle.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.DetalleLabel, string.Empty);
            }

            if (result)
            {
                try
                {
                    if (ComprasManager.Instancia.ExisteDocumento(GetCompra()))
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Ya existe un documento del mismo tipo, serie y número.");
                        result = false;
                    }
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
                
            }
            
            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.cwfDetallesCompras1.Enabled = !valor;
            this.compraBindingNavigator.Enabled = valor;
            this.compraDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.compraDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.compraDataGridView.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.compraIDLabel.Text = "0";
            lblCodigo.CargarCodigo(MotivoMovimiento.Compras, 0);
            this.proveedorIDLabel.Text = "-1";
            this.proveedorCmb.Text = "[Seleccionar un proveedor]";
            this.cmbTipoDocumento.SelectedIndex = 0;
            this.serieTextBox.Text = string.Empty;
            this.numeroTextBox.Text = string.Empty;
            this.precioTextBox.Text = "0";
            this.errValidator.Clear();
        }

        private void SetFont()
        {
            this.font = SystemFonts.IconTitleFont;
            if (this.Font != font)
            {
                this.Font = this.font;
                this.font = new Font("Tahoma", 7);
                this.compraDataGridView.RowTemplate.Height = (TextRenderer.MeasureText("I", this.font).Height + 5) * 3;
            }
        }

        private void platoDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if ((e.ColumnIndex >= 0) && (e.RowIndex >= 0))
            {
                Graphics g = e.Graphics;
                bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
                System.Drawing.Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
                System.Drawing.Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
                Font font = e.CellStyle.Font;
                font = new Font("Tahoma", 7);

                Compras compra = this.compraBindingSource[e.RowIndex] as Compras;

                if (compra != null)
                {
                    int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                    int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                    int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                    int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                    g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                    y = y + height - 1;

                    if (e.ColumnIndex == 0)
                    {
                        font = new Font("Tahoma", 8, FontStyle.Bold);

                        if (selected)
                            TextRenderer.DrawText(e.Graphics, compra.codigo, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, compra.codigo, font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, compra.nombreDocumento + " " + compra.serieDocumento + "/" + compra.numeroDocumento , font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                    else
                    {
                        font = new Font("Tahoma", 9, FontStyle.Bold);
                        if (selected)
                            TextRenderer.DrawText(e.Graphics, compra.fechaEmision.ToString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, compra.fechaEmision.ToString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, compra.nombreProveedor, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                }

                e.Handled = true;
            }
            else if ((e.ColumnIndex == 0) && (e.RowIndex >= 0))
            {
                e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.Focus);
                e.Handled = true;
            }
        }

        private void platoDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex == this.compraBindingSource.Position)
            {
                e.DrawFocus(e.RowBounds, true);
            }
            else
            {
                using (Pen p = new Pen(Color.LightGray))
                {
                    e.Graphics.DrawRectangle(p, e.RowBounds);
                }
            }
        }

        private void proveedorCmb_DropDown(object sender, EventArgs e)
        {
            cwfProveedorBusqueda.limpiar();
            proveedorCmb.Text = "[Seleccionar un proveedor]";
        }

        public void proveedorBusqueda_SeleccionEntidad(object objeto)
        {
            Proveedores proveedor = (Proveedores)objeto;
            proveedorCmb.Text = proveedor.razonSocial;
            proveedorIDLabel.Text = proveedor.proveedorID.ToString();
            cmbTipoDocumento.Focus();
            proveedorCmb.HideDropDown();
        }

        private void proveedorCmb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                proveedorCmb.ShowDropDown();
            }
            else
                e.SuppressKeyPress = true;
        }

        private void cmbComprasEstados_SelectedIndexChanged(object sender, EventArgs e)
        {
            InitialLoad();
        }
    }
}
